package utils

import (
	"crypto/md5"
	"encoding/hex"
	"io"
	"net/http"
	"os"
	"path/filepath"
	"strings"
)

func DownloadFile(url string) (error, map[string]interface{}) {
	// 获取当前用户目录
	homeDir, err := os.UserHomeDir()
	if err != nil {
		return err, nil
	}

	// 创建临时文件夹路径
	tempDir := filepath.Join(homeDir, "temp_folder")
	if _, err = os.Stat(tempDir); os.IsNotExist(err) {
		// 如果文件夹不存在，则创建
		err = os.Mkdir(tempDir, os.ModePerm)
		if err != nil {
			return err, nil
		}
	}

	// 从url获取文件名
	fileName := filepath.Base(url)

	// 获取文件扩展名
	fileExt := filepath.Ext(fileName)

	// 如果URL中包含文件扩展名，则使用URL中的扩展名
	if strings.Contains(fileExt, ".") {
		fileExt = strings.TrimPrefix(fileExt, ".")
	} else {
		// 如果URL中没有扩展名，则从URL中获取
		lastDotIndex := strings.LastIndex(url, ".")
		if lastDotIndex != -1 {
			fileExt = url[lastDotIndex+1:]
		}
	}

	// 创建本地文件路径
	localFilePath := filepath.Join(tempDir, fileName)

	// 创建本地文件
	localFile, err := os.Create(localFilePath)
	if err != nil {
		return err, nil
	}
	defer func() {
		localFile.Close()
		// 处理完文件后删除本地文件
		os.Remove(localFilePath)
	}()

	response, err := http.Get(url)
	if err != nil {
		return err, nil
	}
	defer response.Body.Close()

	_, err = io.Copy(localFile, response.Body)
	if err != nil {
		return err, nil
	}

	// 计算文件MD5
	md5hash := md5.New()
	if _, err = io.Copy(md5hash, localFile); err != nil {
		return err, nil
	}
	md5sum := hex.EncodeToString(md5hash.Sum(nil))

	// 获取文件大小
	fileInfo, err := localFile.Stat()
	if err != nil {
		return err, nil
	}
	fileSize := fileInfo.Size()

	// 将文件转为二进制编码
	bytesContent, err := fileToBytes(localFilePath)
	if err != nil {
		return err, nil
	}
	// 将文件转为hex编码
	hexEncoded, err := BytesToHex(bytesContent)
	if err != nil {
		return err, nil
	}
	// 打印结果
	//fmt.Printf("File Extension: %s\n", fileExt)
	//fmt.Printf("MD5: %s\n", md5sum)
	//fmt.Printf("Size: %d bytes\n", fileSize)
	//fmt.Printf("Hex Encoded: %s\n", hexEncoded)

	result := make(map[string]interface{})
	result["fileExt"] = fileExt
	result["md5sum"] = md5sum
	result["fileSize"] = fileSize
	result["hexEncoded"] = hexEncoded
	result["bytesContent"] = bytesContent
	return nil, result
}

func fileToBytes(filePath string) ([]byte, error) {
	content, err := os.ReadFile(filePath)
	if err != nil {
		return nil, err
	}
	return content, nil
}

func BytesToHex(content []byte) (string, error) {
	return hex.EncodeToString(content), nil
}
